package es.ull.etsii.aa.datos;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.LinkedList;

public class Problema {
	
	private String filename;

	private LinkedList<Nodo> listaNodos = new LinkedList<Nodo>();

	private int capacidadCamiones = 0;		// Qt
	private int capacidadTrailers = 0;		// Qr
	private int numeroCamiones = 0;			// mt
	private int numeroTrailers = 0;			// mr
	private int numeroNodos = 0;			// N

	/**
	 * Constructor dado un fichero.
	 * 
	 * @param fich
	 *            Fichero a procesar.
	 */
	public Problema(File fich) {
		
		filename = fich.getName();
		
		InputStream is = null;

		try {
			is = new FileInputStream(fich);

			leeFichero(is);
		} catch (FileNotFoundException e) {
			System.err.println("Error - No se ha encontrado el fichero "
					+ fich.getName());

			System.exit(1);
		} finally {
			try {
				is.close();
			} catch (IOException e) {

			}
		}

	}

	/**
	 * Constructor dado un stream de lectura de fichero.
	 * 
	 * @param fis
	 *            Stream de lectura de fichero a procesar.
	 */
	public Problema(InputStream is) {
		leeFichero(is);
	}

	/**
	 * Obtiene la lista de Nodos consumidores del problema
	 * 
	 * @return lista de nodos consumidores
	 */
	public LinkedList<Nodo> getListaConsumidores() {
		LinkedList<Nodo> consumidores = new LinkedList<Nodo>(listaNodos.subList(1, listaNodos.size()));
		return consumidores;
	}
	
	/**
	 * Obtiene la lista de Nodos del camino leido por la entrada
	 * retornando al nodo almacen
	 * 
	 * @return lista de nodos del camino
	 */
	public LinkedList<Nodo> getCamino() {
		LinkedList<Nodo> camino = new LinkedList<Nodo>(listaNodos);
		camino.addLast(listaNodos.getFirst());
		return camino;
	}
	
	/**
	 * Obtiene la capacidad de los camiones.
	 * 
	 * @return Capacidad de los camiones.
	 */
	public int getCapacidadCamiones() {
		return capacidadCamiones;
	}

	/**
	 * Obtiene la capacidad de los trailers.
	 * 
	 * @return Capacidad de los trailers.
	 */
	public int getCapacidadTrailers() {
		return capacidadTrailers;
	}

	/**
	 * Obtiene el nodo con indice i-esimo.
	 * 
	 * @param i
	 *            Indice del nodo.
	 * @return Nodo con indice i-esimo.
	 */
	public Nodo getNodo(int i) {
		return listaNodos.get(i);
	}

	/**
	 * Obtiene el numero de camiones.
	 * 
	 * @return Numero de camiones.
	 */
	public int getNumeroCamiones() {
		return numeroCamiones;
	}

	/**
	 * Obtiene el numero de nodos.
	 * 
	 * @return Numero de nodos.
	 */
	public int getNumeroNodos() {
		return numeroNodos;
	}
	
	/**
	 * Obtiene el numero de trailers.
	 * 
	 * @return Numero de trailers.
	 */
	public int getNumeroTrailers() {
		return numeroTrailers;
	}

	/**
	 * Obtiene el nombre del fichero del problema
	 * @return
	 */
	public String getFileName() {
		return filename;
	}
	
	/**
	 * Procesa un fichero de datos.
	 * 
	 * @param fis
	 *            Stream de lectura de fichero a procesar.
	 */
	private void leeFichero(InputStream fis) {
		InputStreamReader isr = null;
		BufferedReader br = null;
		String[] datos;

		try {
			isr = new InputStreamReader(fis);
			br = new BufferedReader(isr);

			// Leemos los parametros del problema.
			datos = br.readLine().split("\t");

			capacidadCamiones = Integer.parseInt(datos[0]);
			numeroCamiones = Integer.parseInt(datos[1]);
			capacidadTrailers = Integer.parseInt(datos[2]);
			numeroTrailers = Integer.parseInt(datos[3]);
			numeroNodos = Integer.parseInt(datos[4]);

			// Leemos el nodo que actua como deposito
			datos = br.readLine().split("\t");

			listaNodos.add(new Nodo(Integer.parseInt(datos[1]),
			                        Integer.parseInt(datos[2])));

			// Leemos los nodos que actuan como consumidores.
			for (int i = 0; i < numeroNodos; i++) {
				datos = br.readLine().split("\t");

				listaNodos.add(new Nodo(Integer.parseInt(datos[0]),
				                        Integer.parseInt(datos[1]),
				                        Integer.parseInt(datos[2]),
				                        Integer.parseInt(datos[3]),
				                        Integer.parseInt(datos[4])));
			}
		} catch (IOException e) {
			System.err.println("Error - Error leyendo el fichero.");

			System.exit(1);
		} finally {
			try {
				br.close();
			} catch (IOException e) {

			}
		}
	}

}
